#include "bsp_systick.h"
#include "stm32f10x.h"
#include "rtdef.h"

volatile uint64_t G_Timer_Tick = 0; // 定义系统全局运行时间
volatile uint32_t OS_Tick = 0; // 仿操作系统时间滴答变量，每隔 1ms 增加 1


int SysTick_Init(void)
{
	// 不使用次级优先级，我们只抢占式
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    // 把滴答定时器的优先级设置为最低
    NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_PriorityGroup_4, 15, 0));        
    if (SysTick_Config(SystemCoreClock/1000) == 0)		// 每隔 1ms 进一次系统滴答中断响应函数，主频 72M
	{
		return 0;
	}else
	{
		return -1;
	}
}
INIT_BOARD_EXPORT(SysTick_Init);


void SysTick_Delay_us(uint32_t nus) //注意该函数延时不能超过1ms 
{
    uint32_t delta = 0;
    // 获得延时需要经过的tick数
	// SysTick->LOAD就是前面使用SysTick_Config得到的经过多少个心跳进入1微秒中断函数
    nus = nus * (SysTick->LOAD / 1000);
    // 获得当前时间，通过计算时间差来获得延迟
    delta = SysTick->VAL;
    /* 循环获得当前时间，直到达到指定的时间后退出循环 */
    while (delta - SysTick->VAL < nus);
}

void Precise_Delay_us(uint32_t udelay)
{
    __IO uint32_t Delay = udelay * 72 / 8;
    do
    {
        __NOP();
    }
    while (Delay--);
}


void SysTick_Delay_ms(uint32_t nms) //注意该函数延时不能超过1ms 
{
	for (uint32_t i = 0; i < nms; i++)
    {
        SysTick_Delay_us(1000);
    }
}

